package com.atguigu.gmall.order.config;

import com.atguigu.gmall.rebbit.constant.MqConst;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class CancelOrderConfig {
    /**
     * 其他队列可以在RabbitListener上面做绑定
     * @return
     */

    //创建交换机
    @Bean
    public Exchange deadLetterExchange(){
        //return new DirectExchange(exchange_dead);//选择什么模式的交换机
        return ExchangeBuilder.directExchange(MqConst.EXCHANGE_DIRECT_ORDER_CANCEL).build();//通过封装类进行创建
    }

    //创建队列  死信队列后通过普通队列进行接收
    @Bean
    public Queue queue(){
        return QueueBuilder.durable(MqConst.QUEUE_ORDER_CANCEL1).build();//通过queue队列的配置类进行生产
    }
    //创建死信队列
    @Bean
    public Queue dealLetterQueue(){
        Map<String,Object> map=new HashMap<>();
        //到达过期时间，转发的死信交换机名称、
        map.put("x-dead-letter-exchange", MqConst.EXCHANGE_DIRECT_ORDER_CANCEL);
        //转发的死信routingkey 路由器的名称
        map.put("x-dead-letter-routing-key",MqConst.ROUTING_ORDER_CANCEL1);
        //转发的默认时间，参数传值时，使用传递的数据
        map.put("x-message-ttl",80000);
        //withArguments配置死信队列信息
        return QueueBuilder.durable(MqConst.QUEUE_ORDER_CANCEL).withArguments(map).build();
        //        //方式一与方式二切换时，必须先删除对应交换机与队列，否则出错
        //return new Queue(queue_dead_1, true, false, false, map);
    }

    //绑定死信队列
    @Bean
    public Binding bindingDeadLetterQueue(){
        //通过配置类直接绑定queue的方法名
        //参数1： 绑定queue  参数2：绑定交换机 参数3：绑定routingkey 参数4：noargs相当于build
        return BindingBuilder.bind(dealLetterQueue()).to(deadLetterExchange()).with(MqConst.ROUTING_ORDER_CANCEL).noargs();
    }

    //绑定普通队列
    @Bean
    public Binding bindingQueue(){
        //通过配置类直接绑定queue的方法名
        //参数1： 绑定queue  参数2：绑定交换机 参数3：绑定routingkey 参数4：noargs相当于build
        return BindingBuilder.bind(queue()).to(deadLetterExchange()).with(MqConst.ROUTING_ORDER_CANCEL1).noargs();
    }
}
